package com.ssd.config;


import com.ssd.handler.UserInfoHandler;
import com.ssd.interceptor.FeignInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

/**
 * 对远程调用接口扫描生成代理对象
 * 此配置类主要用于扫描指定包下的接口，并生成Feign客户端代理对象
 * 它还通过导入自定义查询映射编码器和条件属性来增强Feign客户端的功能
 */
// 使用Slf4j日志框架
@Slf4j
// 定义配置类
@Configuration
// 启用Feign客户端，指定基础包路径
@EnableFeignClients(basePackages = "com.ssd.api")
// 导入自定义的查询映射编码器
@Import({com.ssd.utils.MyQueryMapEncoder.class})
// 根据配置属性条件加载，仅当feign.enable属性值为true时生效
@ConditionalOnProperty(prefix = "feign", name = "enable", havingValue = "true")
public class ClientScanConfiguration {

    /**
     * 创建Feign拦截器Bean
     * 该拦截器用于在Feign请求过程中添加用户信息和请求ID，以便于追踪和安全控制
     *
     * @param userInfoHandler 用户信息处理器，用于提供用户信息
     * @return FeignInterceptor实例，用于拦截和处理Feign请求
     */
    @Bean
    public FeignInterceptor feignInterceptor(UserInfoHandler userInfoHandler){
        return new FeignInterceptor(userInfoHandler);
    }

}

